﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using Engine;

namespace MyControls
{
    /// <summary>
    /// User's component tương ứng với một câu hỏi trong game đua xe và mê cung
    /// </summary>
    public partial class XeThoCom : UserControl
    {
        #region Properties
        private string _stt = string.Empty;
        /// <summary>
        /// Số thứ tự của phần tử
        /// </summary>
        public string STT
        {
            set
            {
                _stt = value;
                lblSTT.Text = _stt;
            }
            get { return _stt; }
        }

        private string _isTuLuan = "0";
        /// <summary>
        /// Loại câu hỏi
        /// </summary>
        public string IsTuLuan
        {
            set
            {
                _isTuLuan = value;
                if(_isTuLuan == "1")
                    optTN.Checked = !(optTL.Checked = true);
                else
                    optTN.Checked = !(optTL.Checked = false);
            }
            get { return _isTuLuan; }
        }

        private Image _image = null;
        /// <summary>
        /// File ảnh đề bài
        /// </summary>
        public Image Image
        {
            set
            {
                _image = value;
                picData.Image = _image;
                bool visible = (_image != null);
                _capture = cmdBrowse.Visible = rtxData.Visible = !(cmdEdit.Visible = picData.Visible = visible);                
            }
            get { return _image; }
        }

        private string _fileName = string.Empty;
        /// <summary>
        /// Tên file ảnh câu hỏi lưu xml
        /// </summary>
        public string MainFileName
        {
            set { _fileName = value; }
            get { return _fileName; }
        }

        private string _fullPath = string.Empty;
        /// <summary>
        /// Đường dẫn đầy đủ file ảnh lưu xml
        /// </summary>
        public string FullPath
        {
            set { _fullPath = value; }
            get { return _fullPath; }
        }

        private string _level = string.Empty;
        /// <summary>
        /// Mức: dễ, bình thường, khó
        /// </summary>
        public string Level
        {
            set
            {
                _level = value;
            }
            get { return _level; }
        }

        private bool _capture = false;

        private bool _modify = true;
        /// <summary>
        /// Trạng thái của phần tử
        /// Căn cứ vào đây để biết có cần tải lại ảnh hay không
        /// </summary>
        public bool Modify
        {
            set { _modify = value; }
            get { return _modify; }
        }

        private List<ChildXeThoCom> _component = null;
        public List<ChildXeThoCom> Component
        {
            set { _component = value; }
            get
            {
                if(_component == null)
                    _component = new List<ChildXeThoCom>();
                return _component;
            }
        }
        private int _soPT = 4;
        #endregion

        #region Declare variable
        private Button[] delButton;
        #endregion

        #region Constructors
        public XeThoCom()
        {
            InitializeComponent();
            Init();
            SetProperties("0", string.Empty, null, string.Empty, true, true);
        }
        #endregion

        #region Methods
        /// <summary>
        /// Thêm một component vào cuối danh sách
        /// </summary>
        /// <param name="com">Component</param>
        public void AppendCom(ChildXeThoCom com)
        {
            try
            {
                if (_component == null)
                {
                    _component = new List<ChildXeThoCom>();
                }
                com.Visible = false;
                _component.Add(com);
                this.grpAnswer.Controls.Add(com);
            }
            catch (Exception)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }

        /// <summary>
        /// Hiển thị các component
        /// </summary>
        public void ShowCom()
        {
            try
            {
                VisiableButton();
                int _x = cmdAddNormal.Width + 20;
                int _y = 10;
                int curx = _x;
                int cury = _y;
                for (int i = 0; i < _component.Count; i++)
                {
                    _component[i].Visible = true;
                    _component[i].Location = new Point(curx, cury + i * _component[i].Height + 10);
                    this.delButton[i].Visible = true;
                    this.delButton[i].Location = new Point(curx + _component[i].Width + 20, cury + i * _component[i].Height + 10);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }

        /// <summary>
        /// Xóa component
        /// </summary>
        /// <param name="index">Vị trí cần xóa</param>
        private void DelCom(int index)
        {
            try
            {
                if (_component == null)
                {
                    return;
                }
                this.grpAnswer.Controls.Remove(_component[index]);
                _component.RemoveAt(index);
            }
            catch (Exception)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }

        /// <summary>
        /// Make danh sách các button thêm component và xóa component
        /// </summary>
        private void Init()
        {
            try
            {
                delButton = new Button[_soPT];
                for (int i = 0; i < delButton.Length; i++)
                {
                    this.delButton[i] = new Button();
                    this.delButton[i].Text = "Xóa";
                    this.delButton[i].Name = i.ToString();
                    this.delButton[i].Size = new Size(47, 23);
                    this.delButton[i].Click += new EventHandler(cmdDel_Click);
                    this.grpAnswer.Controls.Add(this.delButton[i]);
                    this.delButton[i].Visible = false;
                }
                if(delButton.Length > 0)
                    delButton[0].Enabled = false;
            }
            catch (Exception)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }

        /// <summary>
        /// Ẩn các button thêm và xóa component
        /// </summary>
        private void VisiableButton()
        {
            try
            {
                for (int i = 0; i < delButton.Length; i++)
                {
                    this.delButton[i].Visible = false;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }

        /// <summary>
        /// Capture image from richtextbox
        /// </summary>
        public void MyCapture(int _class)
        {

            if (this.IsTuLuan == "0")//Trắc nghiệm
            {
                for (int i = 0; i < this.Component.Count; i++)
                {
                    if (i == 0)
                        Component[i].IsTrue = "1";
                    else
                        Component[i].IsTrue = "0";
                }
            }
            else
            {
                foreach (ChildXeThoCom childXeThoCom in this.Component)
                {
                    childXeThoCom.IsTrue = "1";
                }
            }

            if (_capture)
            {
                MainFileName = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss:fffffff").Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty);
                MainFileName += ".png";
                // Bo het dau xuong dong
                string stringText = rtxData.Text.Replace("\n", string.Empty);
                stringText = stringText.Trim();
                if (stringText.CompareTo("") == 0)
                {
                    CEngine.CreateImageFromEquations(ref rtxData, MainFileName, false);
                }
                // Nguoc lai neu khong phai la so binh thuong
                else
                {
                    CEngine.CreateImageFromText(rtxData.Text, MainFileName, _class);
                }
                SetProperties(Level, MainFileName, Image.FromFile(Environment.CurrentDirectory + @"\" + MainFileName), Environment.CurrentDirectory + @"\" + MainFileName, Modify, _capture);
            }
        }

        /// <summary>
        /// Set value cho một số properties
        /// </summary>
        /// <param name="level"></param>
        /// <param name="fileName"></param>
        /// <param name="image"></param>
        /// <param name="fullPath"></param>
        /// <param name="modify"></param>
        /// <param name="capture"></param>
        private void SetProperties(string level, string fileName, Image image, string fullPath, bool modify, bool capture)
        {
            Level = level;
            MainFileName = fileName;
            Image = image;
            FullPath = fullPath;
            Modify = modify;
            _capture = capture;
        }

        /// <summary>
        /// Thay đổi trạng thái component sang trạng thái vừa load dữ liệu
        /// Method này dùng ngay sau khi đã upload picture data lên server để tránh upload khi không có sửa đổi gì.
        /// (xml thì cho phép upload lại)
        /// </summary>
        public void ChangeStatusToLoad()
        {
            _capture = Modify = false;
            cmdEdit.Visible = picData.Visible = true;
            picData.Image = Image;
            cmdBrowse.Visible = rtxData.Visible = false;
        }
        #endregion

        #region Events
        private void cmdAddNormal_Click(object sender, EventArgs e)
        {
            try
            {
                if (Component.Count < _soPT)
                {
                    ChildXeThoCom com = new ChildXeThoCom();
                    com.IsTuLuan = (this.IsTuLuan == "1");
                    AppendCom(com);
                    ShowCom();
                    com.Focus();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }

        private void cmdDel_Click(object sender, EventArgs e)
        {
            try
            {
                string name = ((Button)sender).Name;
                int idx = System.Convert.ToInt32(name);
                int cur = idx;

                DelCom(cur);
                ShowCom();
            }
            catch (Exception)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }

        private void cmdEdit_Click(object sender, EventArgs e)
        {
            DialogResult dialogResult = MessageBox.Show("Nếu chấp nhận sửa bạn sẽ phải nhập lại nội dung.\n Bạn có chắc muốn sửa?", "Xac nhan sua", MessageBoxButtons.YesNo,
                                                        MessageBoxIcon.Question);
            if (dialogResult == DialogResult.Yes)
            {
                SetProperties(Level, string.Empty, null, string.Empty, true, true);
                rtxData.Focus();
            }
        }

        private void cmdBrowser_Click(object sender, EventArgs e)
        {
            OpenFileDialog _openFileDialog = new OpenFileDialog();
            _openFileDialog.Filter = "Image PNG|*.png|Image Jpeg|*.jpg|Image Bitmap|*.bmp|All Images|*.png;*.jpg;*.jpeg;*.bmp";
            _openFileDialog.RestoreDirectory = true;
            _openFileDialog.Title = "Select one image file!";
            if (_openFileDialog.ShowDialog() == DialogResult.OK)
            {
                System.Drawing.Image tmp = Image.FromFile(Path.GetFullPath(_openFileDialog.FileName));
                if (tmp.Size.Width > picData.Size.Width || tmp.Size.Height > picData.Height)
                {
                    MessageBox.Show(
                        "Ảnh quá lớn! Vui lòng chọn ảnh kích thước nhỏ hơn hoặc bằng " + picData.Size.Width + "x" +
                        picData.Size.Height, "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                _capture = false;

                MainFileName = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss:fffffff").Replace("/", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty);
                MainFileName += ".png";
                SetProperties(Level, MainFileName, Image.FromFile(Path.GetFullPath(_openFileDialog.FileName)), Path.GetFullPath(_openFileDialog.FileName), true, false);
                picData.Image = Image.FromFile(Path.GetFullPath(_openFileDialog.FileName));
            }
        }

        private void optTL_CheckedChanged(object sender, EventArgs e)
        {
            if (optTL.Checked)
            {
                this.IsTuLuan = "1";
                foreach (ChildXeThoCom childXeThoCom in Component)
                {
                    childXeThoCom.IsTuLuan = true;
                }
            }
            else
            {
                this.IsTuLuan = "0";
                foreach (ChildXeThoCom childXeThoCom in Component)
                {
                    childXeThoCom.IsTuLuan = false;
                }
            }
        }
        
        #endregion
    }
}